package qc.module.iot.protocol;

import lombok.Data;
import qc.common.core.enums.iot.IotPacketsDataFrameTypeEnum;
import qc.common.core.enums.iot.IotPacketsDataProtocolEnum;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 数据帧解析结果类
 *
 * @author QuCheng Tech
 * @since 2025/11/5
 */
@Data
public class IotFrameParseResult {
    /**
     * 输入的原始报文字节数组
     */
    private byte[] inputBytes;
    /**
     * 输入的原始报文Hex字符串
     */
    private String inputHexString;

    //数据帧解析结果
    /**
     * 数据帧解析结果--数据协议；最终实际使用的报文数据协议，比如德宏水文局发送数据总有多种不同协议混合使用
     */
    private IotPacketsDataProtocolEnum protocol;
    /**
     * 数据帧解析结果--是否解析成功
     */
    private boolean parseSuccess;
    /**
     * 数据帧解析结果--解析错误提示信息
     */
    private String parseErrorMsg;
    /**
     * 数据帧解析结果--解析出的数据帧完整的字节数组
     * 可能与输入的原始报文字节数组一致，也可能是其中一部分，未解析成功时为空
     */
    private byte[] parseFrameBytes;
    /**
     * 数据帧解析结果--解析出的数据帧完整的字符串，根据实际使用的数据协议转换为对应的Hex或Ascii字符串
     */
    private String parseFrameString;

    //解析出的数据帧中的数据
    /**
     * 数据帧中的正文长度
     */
    private int bodyLength;
    /**
     * 数据帧中的中心站地址，字符串方便进行显示，字节数组用于需要生成回复报文时传入
     */
    private String centerAddress;
    /**
     * 数据帧中的中心站地址
     */
    private byte[] centerAddressBytes;
    /**
     * 数据帧中的遥测站地址，字符串方便进行显示，字节数组用于需要生成回复报文时传入
     */
    private String stationAddress;
    /**
     * 数据帧中的遥测站地址
     */
    private byte[] stationAddressBytes;
    /**
     * 数据帧中的密码，字符串方便进行显示，字节数组用于需要生成回复报文时传入
     */
    private String password;
    /**
     * 数据帧中的密码
     */
    private byte[] passwordBytes;
    /**
     * 数据帧中的功能码，字符串方便进行显示，字节数组用于需要生成回复报文时传入
     */
    private String functionCode;
    /**
     * 数据帧中的功能码
     */
    private byte[] functionCodeBytes;
    /**
     * 数据帧名称，功能码对应的文字
     */
    private String frameName;
    /**
     * 数据帧类型
     */
    private IotPacketsDataFrameTypeEnum frameType;
    /**
     * 上下行数据帧标记，是否为上行帧
     */
    private boolean isUpDirection;
    /**
     * 数据帧中的数据时标，或者携带的时间
     */
    private LocalDateTime dataTime;
    /**
     * 数据帧中的正文内容字节数组
     */
    private byte[] bodyDataBytes;
    /**
     * 数据帧中的正文内容字符串，根据实际使用的数据协议转换为对应的Hex或Ascii字符串
     */
    private String bodyDataString;
    /**
     * 数据帧中的正文内容项集合，根据数据帧类型和实际报文解析出的结果，可以为空或多个
     */
    private List<IotFrameBodyDataItem> bodyDataItems;
    /**
     * 指示CRC是否正确，crc判断不正确也可以根据实际情况确定是否当做有效数据帧
     */
    private boolean crcIsCorrect;
    /**
     * 数据帧中的crc字节数组
     */
    private byte[] crcBytes;
}
